#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

// 检查字符对应的分值
int check(const char& ch) {
    if (ch == 'l') return 4;
    if (ch == 'o') return 3;
    if (ch == 'v') return 2;
    if (ch == 'e') return 1;
    return 0;
}

int main() {
    int ret = 0;
    int n, m;
    cin >> n >> m;
    // 存储字符矩阵
    vector<vector<char>> a(n, vector<char>(m));
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            cin >> a[i][j];
        }
    }
    // 动态规划数组，初始化为 0
    vector<vector<int>> dp(n, vector<int>(m, 0));

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            if (i == 0 && j == 0) {
                // 左上角元素，直接计算分值
                dp[i][j] = check(a[i][j]);
            } else if (i == 0) {
                // 第一行元素，只能从左边转移过来
                dp[i][j] = dp[i][j - 1] + check(a[i][j]);
            } else if (j == 0) {
                // 第一列元素，只能从上边转移过来
                dp[i][j] = dp[i - 1][j] + check(a[i][j]);
            } else {
                // 其他位置，取左边和上边的最大值加上当前字符的分值
                dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]) + check(a[i][j]);
            }
            // 更新最大分值
            ret = max(ret, dp[i][j]);
        }
    }
    cout << ret << endl;
    return 0;
}